﻿using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace YourLastOptionsDialog.Common
{
    /// <summary>
    /// Converts a boolean value to a visibility value. The converter parameter allows inversion of the behavior, i.e.:
    /// value == true  AND parameter == false => Visibility.Visible
    /// value == true  AND parameter == true  => Visibility.Collapsed
    /// value == false AND parameter == false => Visibility.Collapsed
    /// value == false AND parameter == true  => Visibility.Visible
    /// </summary>
    public class BooleanToVisibilityConverter : IValueConverter
    {
        #region Implementation of IValueConverter

        /// <summary>
        /// Modifies the source data before passing it to the target for display in the UI.
        /// </summary>
        /// <param name="value">The source data being passed to the target.</param>
        /// <param name="targetType">The <see cref="T:System.Type"/> of data expected by the target dependency property.</param>
        /// <param name="parameter">An optional parameter to be used in the converter logic.</param>
        /// <param name="culture">The culture of the conversion.</param>
        /// <returns>
        /// The value to be passed to the target dependency property.
        /// </returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (parameter == null)
            {
                return Visibility.Collapsed;
            }

            var booleanValue = (bool)value;
            var parameterAsString = parameter.ToString();
            var invert = !string.IsNullOrEmpty(parameterAsString) && System.Convert.ToBoolean(parameter, CultureInfo.InvariantCulture);
            return (booleanValue && invert) || (!booleanValue && !invert) ? Visibility.Collapsed : Visibility.Visible;
        }

        /// <summary>
        /// Modifies the target data before passing it to the source object.  This method is called only in <see cref="F:System.Windows.Data.BindingMode.TwoWay"/> bindings.
        /// </summary>
        /// <param name="value">The target data being passed to the source.</param>
        /// <param name="targetType">The <see cref="T:System.Type"/> of data expected by the source object.</param>
        /// <param name="parameter">An optional parameter to be used in the converter logic.</param>
        /// <param name="culture">The culture of the conversion.</param>
        /// <returns>
        /// The value to be passed to the source object.
        /// </returns>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return null;
        }

        #endregion
    }
}
